﻿using CLM.Gestao.Administrador.DAL;
using CLM.Gestao.Importacao;
using CLM.Gestao.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;

namespace CLM.Gestao.Administrador.BLL
{
    public class CentroCustoDriverRateioTipo : CentroCustoDriverRateioTipoBLO<TB_CENTRO_CUSTO_DRIVER_RATEIO_TIPO>
    {
        #region Propriedades

        #endregion Propriedades

        #region Conversões

        /// <summary>
        /// Converte uma lista de objetos do tipo Lista para uma lista de objetos do tipo correspondente no EDM
        /// </summary>
        /// <param name="pLista"></Lista></param>
        /// <returns></returns>
        private List<TB_CENTRO_CUSTO_DRIVER_RATEIO_TIPO> ConvertToEDM(List<Lista> pLista)
        {
            List<TB_CENTRO_CUSTO_DRIVER_RATEIO_TIPO> List = (from l in pLista
                                                             select new TB_CENTRO_CUSTO_DRIVER_RATEIO_TIPO
                                                                   {
                                                                       ID_CENTRO_CUSTO_DRIVER_RATEIO_TIPO = l.IdCentroCustoDriverRateioTipo,
                                                                       ID_CENTRO_CUSTO = l.IdCentroCusto,
                                                                       ID_DRIVER_RATEIO_TIPO = l.IdDriverRateioTipo,
                                                                       ID_PERIODO_ANO = (int)l.IdPeriodoAno
                                                                   }).ToList();
            return List;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pContext"></param>
        /// <returns></returns>
        private List<Lista> ConvertToContext(IQueryable<TB_CENTRO_CUSTO_DRIVER_RATEIO_TIPO> pContext)
        {
            List<Lista> List = (from l in pContext
                                select new Lista
                                {
                                    IdCentroCustoDriverRateioTipo = l.ID_CENTRO_CUSTO_DRIVER_RATEIO_TIPO,
                                    IdCentroCusto = l.ID_CENTRO_CUSTO,
                                    IdDriverRateioTipo = l.TB_DRIVER_RATEIO_TIPO.ID_DRIVER_RATEIO_TIPO,
                                    IdPeriodoAno = l.ID_PERIODO_ANO
                                }).ToList();
            return List;
        }

        #endregion Conversões

        #region CRUD

        public void Add(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Add(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void Delete(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Delete(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void Update(List<Lista> pLista)
        {
            try
            {
                foreach (var item in ConvertToEDM(pLista))
                    base.Update(item);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        /// <summary>
        /// Efetua a pesquisa na tabela, filtrando as solicitações do usuário
        /// </summary>
        /// <param name="pPesquisa">pPesquisa</param>
        /// <returns>Lista</returns>
        private IQueryable<TB_CENTRO_CUSTO_DRIVER_RATEIO_TIPO> Get(Lista pPesquisa)
        {
            IQueryable<TB_CENTRO_CUSTO_DRIVER_RATEIO_TIPO> Consulta;

            Consulta = from p in GetAll()
                       select p;

            if (pPesquisa != null)
            {
                if (pPesquisa.IdPeriodoAno != null)
                    Consulta = from p in Consulta where p.ID_PERIODO_ANO == pPesquisa.IdPeriodoAno select p;
            }
            return Consulta;
        }

        #endregion CRUD

        #region Retorna Listas e Itens

        public List<Lista> GetLista()
        {
            return GetLista(new Lista());
        }

        public List<Lista> GetLista(Lista pPesquisa)
        {
            var ListaCentroCustoDriverRateioTipo = ConvertToContext(Get(pPesquisa));
            return ListaCentroCustoDriverRateioTipo;
        }

        public List<Itens> GetItens()
        {
            return GetItens(new Lista());
        }

        public List<Itens> GetItens(Lista pPesquisa)
        {
            List<Itens> ListaCentroCustoDriverRateioTipo = (from p in Get(pPesquisa)
                                                            select new Itens()
                                                            {
                                                                IdCentroCustoDriverRateioTipo = p.ID_CENTRO_CUSTO_DRIVER_RATEIO_TIPO
                                                            }).ToList();
            return ListaCentroCustoDriverRateioTipo;
        }

        #endregion Retorna Listas e Itens

        #region Consultas

        #endregion Consultas

        #region Processos

        #endregion

        #region Classes

        /// <summary>
        /// Classe utilizada para preenchimento de Combos
        /// </summary>
        public class Itens
        {
            public int IdCentroCustoDriverRateioTipo { get; set; }

        }

        /// <summary>
        /// Classe utilizada para preenchimento de Grids
        /// </summary>
        public class Lista
        {
            public int IdCentroCustoDriverRateioTipo { get; set; }
            public int IdCentroCusto { get; set; }
            public int IdDriverRateioTipo { get; set; }
            public int? IdPeriodoAno { get; set; }
        }

        #endregion Classes
    }

    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class CentroCustoDriverRateioTipoBLO<T> : IBLO<T> where T : TB_CENTRO_CUSTO_DRIVER_RATEIO_TIPO
    {
        /// <summary>
        /// 
        /// </summary>
        private CentroCustoDriverRateioTipoDAO<T> _base = new CentroCustoDriverRateioTipoDAO<T>();

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        /// <returns></returns>
        public T Add(T pEntity)
        {
            Validate(pEntity);
            _base.Add(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        /// <returns></returns>
        public T Save(T pEntity)
        {
            Validate(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        public void Delete(T pEntity)
        {
            _base.Delete(pEntity);
            _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        /// <returns></returns>
        public T Update(T pEntity)
        {
            Validate(pEntity);
            _base.Update(pEntity);
            return _base.Save(pEntity);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IQueryable<T> GetAll()
        {
            return _base.GetAll();
        }

        public void Validate(T pEntity)
        {

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="pEntity"></param>
        public void ValidateDelete(T pEntity)
        {
            //int Perfilvalidate = (from u in _base.GetAll()
            //                      where u.TB_USUARIO.Where(w => w.ID_PERFIL_ACESSO == pEntity.ID_PERFIL_ACESSO).Select(s => s).Count() > 0
            //                      select u).Count();

            //if (Perfilvalidate > 0)
            //    throw new Exception("Existem usuários relacionados com este perfil de acesso.\nA operação não pôde ser concluída");
        }
    }
}